<?php
/**
 * $Id: mysql.php 19 2009-06-08 08:45:14Z eyou80 $
 */

/** 载入适配器接口 **/
require_once 'tinyask/db/adapter.php';

/**
 * 数据库Mysql适配器
 *
 * @package Db
 */
class Tinyask_Db_Adapter_Mysql implements Tinyask_Db_Adapter
{
	/**
	 * 连接标识
	 *
	 * @var resource
	 */
	private $_dbLink;

	/**
	 * 判断适配器是否可用
	 *
	 * @return boolean
	 */
	public static function isAvailable()
	{
		return function_exists('mysql_connect');
	}

	/**
	 * 数据库连接
	 *
	 * @param Tinyask_Config $config
	 * @throws Tinyask_Db_Exception
	 * @return resource
	 */
	public function connect(Tinyask_Config $config)
	{
		if($this->_dbLink = @mysql_connect($config->host . ':' . $config->port, $config->user, $config->password, true)) {
			if(@mysql_select_db($config->database, $this->_dbLink)) {
				if($config->charset) {
					mysql_query("SET NAMES '{$config->charset}'", $this->_dbLink);
				}
				return $this->_dbLink;
			}
		}

		/** 抛出异常 **/
		throw new Tinyask_Db_Exception(@mysql_error(), mysql_errno());
	}

	/**
	 * 执行查询
	 *
	 * @param mixed $sql
	 * @param string $action
	 * @param resource $handle
	 * @throws Tinyask_Db_Exception
	 * @return resource
	 */
	public function query($sql, $action, $handle)
	{
		if($resource = @mysql_query($sql instanceof Tinyask_Db_Sql ? $sql->__toString() : $sql, $handle)) {
			return $resource;
		}

		/** 抛出异常 **/
		throw new Tinyask_Db_Exception(@mysql_error($this->_dbLink), mysql_errno($this->_dbLink));
	}

	/**
	 * 将数据查询的其中一行作为数组取出,其中字段名对应数组键值
	 *
	 * @param resource $resource
	 * @return array
	 */
	public function fetch($resource)
	{
		return mysql_fetch_assoc($resource);
	}

	/**
	 * 将数据查询的其中一行作为对象取出,其中字段名对应对象属性
	 *
	 * @param resource $resource
	 * @return object
	 */
	public function fetchObject($resource)
	{
		return mysql_fetch_object($resource);
	}

	/**
	 * 转义值
	 *
	 * @param string $string
	 * @return string
	 */
	public function quoteValue($string)
	{
		return '\'' . str_replace(array('\'', '\\'), array('\'\'', '\\\\'), $string) . '\'';
	}

	/**
	 * 转义字段名称
	 *
	 * @param string $string
	 * @return string
	 */
	public function quoteField($string)
	{
		return '`' . $string . '`';
	}

	/**
	 * 合成sql查询语句
	 *
	 * @param array $sql
	 * @return string
	 */
	public function mergeSelect(array $sql)
	{
		if(!empty($sql['join'])) {
			foreach($sql['join'] as $val) {
				list($table, $condition, $op) = $val;
				$sql['table'] .= " $op JOIN $table ON $condition";
			}
		}

		$sql['limit'] = (strlen($sql['limit']) == 0)  ? null : ' LIMIT ' . $sql['limit'];
		$sql['offset'] = (strlen($sql['offset']) == 0) ? null : ' OFFSET ' . $sql['offset'];

		return 'SELECT ' . $sql['fields'] . ' FROM ' . $sql['table'] .
		$sql['where'] . $sql['group'] . $sql['order'] . $sql['limit'] . $sql ['offset'];
	}

	/**
	 * 获取最后一次查询影响的行数
	 *
	 * @param resource $resource
	 * @param resource $handle
	 * @return integer
	 */
	public function affectedRows($resource, $handle)
	{
		return mysql_affected_rows($handle);
	}

	/**
	 * 获取最后一次插入返回的主键值
	 *
	 * @param resource $resource
	 * @param resource $handle
	 * @return integer
	 */
	public function lastInsertId($resource, $handle)
	{
		return mysql_insert_id($handle);
	}
}
